const Router = require("koa-router");

const { auth, hadAdminPermission } = require("../middleware/auth.middleware");
const { validatorParams } = require("../middleware/general.middleware");
const { verifyFilesType } = require("../middleware/goods.middleware");
const { upload, create, update, remove, restore, findAll } = require("../controller/goods.controller");
const { goodsFormatError } = require("../constant/error.type");

/**
 * 实例化子路由，并设置该路由对象的前缀
 * 实际的路由路径会拼接上路由对象的前缀
 */
const router = new Router({ prefix: "/goods" });

/**
 * 上传商品图片文件接口
 * 实际的路由路径：/goods/upload
 * 当用户请求命中当前路由时，请求交先由auth中间件验证用户是否已经登陆了，如果验证登陆了就交由 hadAdminPermission 中间件进行判断是否有管理员权限，有管理员权限然后再交由 verifyFilesType 检验文件格式，文件格式校验通过再交由upload controller处理
 */
router.post("/upload", auth, hadAdminPermission, verifyFilesType, upload);

/**
 * @swagger
 * /goods: # 发布商品接口
 *   post: # 请求方式
 *     summary: 发布商品接口 # 接口信息
 *     description: 发布商品接口 # 接口描述
 *     tags: [用户] # 接口分组
 *     produces:
 *       - application/json
 *     parameters: # 传递参数
 *       - name: goods_name # 参数名字
 *         description: 商品名称 # 参数信息
 *         in: formData # 参数存放位置formData是存放到请求体中
 *         required: true # 是否是必传参数
 *         type: string # 参数类型
 *       - name: goods_price # 参数名字
 *         description: 商品价格 # 参数信息
 *         in: formData # 参数存放位置formData是存放到请求体中
 *         required: true # 是否是必传参数
 *         type: string # 参数类型
 *       - name: goods_num # 参数名字
 *         description: 商品数量 # 参数信息
 *         in: formData # 参数存放位置formData是存放到请求体中
 *         required: true # 是否是必传参数
 *         type: string # 参数类型
 *       - name: goods_img # 参数名字
 *         description: 商品图片 # 参数信息
 *         in: formData # 参数存放位置formData是存放到请求体中
 *         required: true # 是否是必传参数
 *         type: string # 参数类型
 *     responses: # 返回结果
 *       200:
 *         description: 成功
 */

/**
 * 发布商品接口
 */
router.post(
  "/",
  auth,
  hadAdminPermission,
  validatorParams(
    {
      goods_name: { type: "string", required: true },
      goods_price: { type: "number", required: true },
      goods_num: { type: "number", required: true },
      goods_img: { type: "string", required: true },
    },
    goodsFormatError,
  ),
  create,
);

/**
 * 根据商品id修改商品接口
 */
router.put(
  "/:id",
  auth,
  hadAdminPermission,
  validatorParams(
    {
      goods_name: { type: "string", required: true },
      goods_price: { type: "number", required: true },
      goods_num: { type: "number", required: true },
      goods_img: { type: "string", required: true },
    },
    goodsFormatError,
  ),
  update,
);

/**
 * 根据商品id删除商品接口（硬删除，即从数据库中删除）
 */
// router.delete("/:id", auth, hadAdminPermission, remove);

/**
 * 根据商品id下架商品接口（软删除，即不会从数据库中删除数据，只是从逻辑上删除，并将数据的deletedAt字段的值设置为当前时间戳）
 */
router.post("/:id/off", auth, hadAdminPermission, remove);

/**
 * 上架商品接口（将之前下架的商品从逻辑上恢复，并将数据的deletedAt字段的值设置为NULL）
 */
router.post("/:id/on", auth, hadAdminPermission, restore);

/**
 * 获取商品列表接口
 * 获取商品列表不需要权限
 */
router.get("/", findAll);

module.exports = router;
